iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0

我學習的Java GUI是Swing的內容

今日內容:JFrame, JLabel


JFrame

用來開啟一個視窗,是整個GUI設計的核心

import javax.swing.JFrame;
// ...
JFrame frame = new JFrame();

frame.setTitle("視窗標題"); // 設置視窗標題(預設空白)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 使得關閉視窗會自動結束程式
//如果沒這行關掉視窗時還會繼續跑
//括弧內若改成JFrame.DO_NOTHING_ON_CLOSE,則按X不會有任何行為
frame.setResizable(false); // 讓視窗不能被手動拉大小(預設true)
frame.setSize(640, 640); // 設置視窗大小(單位是px)
frame.setVisible(true); // 使視窗能夠正常顯示(預設是false)

如果想要讓視窗有自己的icon(預設是java的icon)

import javax.swing.ImageIcon;
// ...
ImageIcon image = new ImageIcon("Icon照片的相對位置或絕對位置");
frame.setIconImage(image.getImage());

如果想要設置視窗背景顏色(預設是純白)

import java.awt.Color;
// ...
frame.getContentPane().setBackground(Color.blue); // Color.後面接顏色名字,會用預設的顏色
// 或是 setBackground(new Color(0, 0, 0)); 使用RGB進行調色
// 或是 setBackground(new Color(0x35F2AB)); 使用十六進制調色

除了在main裡面直接創建一個frame,我們也可以自己新增一個class,然後extends JFrame

import javax.swing.JFrame;
import javax.swing.ImageIcon;
import java.awt.Color;

public class MyFrame extends JFrame{
    MyFrame(){
        // 然後將上面那些設置的東西都丟進來,只是將"frame"改成"this"
        this.setTitle("視窗標題");
        this.setResizable(false);
        // ...以此類推,在創建MyFrame的object時就完成初始化
    }
}

之後將會大量使用MyFrame extends JFrame的方式,實際實作Java OOP的概念


JLabel

用於展示文字或圖片的一塊區域

import javax.swing.JLabel;

JLabel label = new JLabel();
label.setText("Hello my friend"); // 設置會顯示在畫面上的文字
label.setIcon(image); // 使用ImageIcon創建的image,會顯示在畫面中

label.setHorizontalTextPosition(JLabel.LEFT); 
// 設置文字與圖片的水平相對位置(LEFT, CENTER, RIGHT)
label.setVerticalTextPosition(JLabel.CENTER);
// 設置文字與圖片的垂直相對位置(TOP, CENTER, BOTTOM)
label.setIconTextGap(100); // 設置文字與圖片之間的距離(可以是負的)

label.setHorizontalAlignment(JLabel.CENTER);
// 設置文字和圖片位於視窗的水平位置(LEFT, CENTER, RIGHT),預設是LEFT
label.setVerticalAlignment(JLabel.CENTER);
// 設置文字和圖片位於視窗的垂直位置(LEFT, CENTER, RIGHT),預設是CENTER

label.setForeground(Color.green); // 設置文字顏色(用上面的Color的東西)
label.setFont(new Font("MV Boli", Font.PLAIN, 20));
// (import java.awt.Font),設置文字形狀(文字型,風格,大小)


label.setBackground(Color.black); // 設置這個label的背景顏色
label.Opaque(true); // 設成true才能在label的範圍內塗滿每個pixel

// 最後要在frame裡面加進去
frame.add(label);

然而,label會盡可能地吃畫面中的範圍,也就是無論你怎麼拉動視窗,label都會把它當成是自己的地盤,因此我們可以使用Border來顯示label吃掉的範圍

import javax.swing.BorderFactory;
import javax.swing.border.Border;

Border border = BorderFactory.createLineBorder(Color.green, 3); 
// 設置邊界(顏色, 粗度)

label.setBorder(border);

現在這個label有屬於自己的border了,接下來要修改label與frame的設定對他進行限制

label.setBounds(0, 0, 250, 250); 
// (x座標,y座標,寬度,高度),x=0 y=0是在視窗左上角

frame.setLayout(null); // 關閉自動布局功能,使label不會占掉整個視窗

或者也可以直接用frame的pack method

/* 可以省去以下幾行:
 * label.setBounds(0, 0, 250, 250);
 * frame.setSize(640, 640);
 * frame.setLayout(null);
 */

// 然後只要輸入這行:
frame.pack(); // 使得"視窗大小"貼合label大小

// 不過這樣還是會因為使用者主動拉動視窗導致不完全貼合,因此可以再設定:
frame.setResizable(false);

結語

今天是接觸Java GUI的第一天,比起之前都是在IntelliJ裡面的Run視窗執行,現在終於打開新的視窗了,感覺很新奇,也成功開啟與使用者交互的另一種方式。
今天也是快樂學習的一天,明天繼續!/images/emoticon/emoticon72.gif


上一篇
Day 11:Java 入門資料結構
下一篇
Day 13:Java GUI (二)
系列文
30天從基礎學起Java,直到做出我的第一個遊戲23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言